package com.example.flashsales.service.impl;

import com.example.flashsales.entity.dto.GoodsDto;
import com.example.flashsales.entity.pojo.Goods;
import com.example.flashsales.entity.pojo.GoodsType;
import com.example.flashsales.entity.vo.GoodsTypeVo;
import com.example.flashsales.entity.vo.GoodsVo;
import com.example.flashsales.mappers.GoodsMapper;
import com.example.flashsales.service.GoodsService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@Service
public class GoodsServiceImpl implements GoodsService {

    @Autowired
    GoodsMapper goodsMapper;


    /**
     * 用户查看所有商品，去商品表查看
     *
     * @param num  一页的条数
     * @param page 页数
     * @return 返回所有商品的视图对象集合
     */
    public List<GoodsVo> viewAllGoods(int num, int page) {
        if (page < 1 || num <= 0) {
            return null;
        }
        //获取所有类型
        final List<GoodsVo> goodsVos = goodsMapper.viewAllGoods(num, (page - 1) * num);
        for (GoodsVo goodsVo : goodsVos) {
            goodsVo.setDetails(getDetailsByDetailsId(goodsVo.getDetailsId()));
            goodsVo.setType(getTypeByTypeId(goodsVo.getTypeId()));
        }
        return goodsVos;
    }


    /**
     * 按类别查看商品（直接去商品表里面查询）
     *
     * @param goodsDto 类别id
     * @param num      条数
     * @param page     页数
     * @return 返回改类别的所有视图对象集合
     */
    public List<GoodsVo> viewGoodsByType(GoodsDto goodsDto, int num, int page) {
        if (page < 1 || num <= 0) {
            return null;
        }
        final List<GoodsVo> goodsVos = goodsMapper.viewGoodsByType(goodsDto.getTypeId(), num, (page - 1) * num);
        for (GoodsVo goodsVo : goodsVos) {
            goodsVo.setType(getTypeByTypeId(goodsVo.getTypeId()));
            goodsVo.setDetails(getDetailsByDetailsId(goodsVo.getDetailsId()));
        }
        return goodsVos;
    }

    /**
     * 按商品名称查看商品（模糊查询，可输入一个字找到与之有关的集合，直接去商品表里面查询）
     *
     * @param name 商品名称
     * @param num  条数
     * @param page 页数
     * @return 返回与改名字有关的所有视图对集合
     */
    public List<GoodsVo> viewGoodsByName(String name, int num, int page) {
        if (page < 1 || num <= 0) {
            return null;
        }
        final List<GoodsVo> goodsVos = goodsMapper.viewGoodsByName(name, num, (page - 1) * num);
        for (GoodsVo goodsVo : goodsVos) {
            goodsVo.setDetails(getDetailsByDetailsId(goodsVo.getDetailsId()));
            goodsVo.setType(getTypeByTypeId(goodsVo.getTypeId()));
        }
        return goodsVos;
    }


    /**
     * 查看商品的具体信息
     *
     * @param id 商品id
     * @return 返回商品的具体信息 包括类别 与描述
     */
    public GoodsVo viewGoodsMessage(long id) {
        final Goods goods = goodsMapper.viewGoodsMessage(id);
        if (goods == null) {
            return null;
        }
        GoodsVo goodsVo = new GoodsVo();
        BeanUtils.copyProperties(goods, goodsVo);
        goodsVo.setDetails(getDetailsByDetailsId(goodsVo.getDetailsId()));
        goodsVo.setType(getTypeByTypeId(goodsVo.getTypeId()));
        return goodsVo;
    }


    /**
     * 添加商品（先添加细节 返回细节id）
     *
     * @param goods 商品信息
     * @return 返回是否添加成功
     */
    @Override
    @Transactional
    public boolean addGoods(GoodsDto goods) {
        //添加细节
        if (goodsMapper.addDetails(goods) > 0) {
            goods.setDetailsId(goods.getId());
        }
        return goodsMapper.addGoods(goods) > 0;
    }


    /**
     * 修改商品描述
     *
     * @param details 描述
     * @param goodsId 商品id
     * @return 返回是否修改成功
     */
    @Override
    public boolean updateDetails(String details, long goodsId) {
        final Goods goods = goodsMapper.viewGoodsMessage(goodsId);
        if (goods == null) {
            return false;
        }
        return goodsMapper.updateDetails(details, goods.getDetailsId()) > 0;
    }


    /**
     * 修改商品信息
     *
     * @param goodsDto 商品信息
     * @return 返回是否修改成功
     */
    @Override
    public boolean updateGoodsMessage(GoodsDto goodsDto) {
        final Goods goods = goodsMapper.viewGoodsMessage(goodsDto.getId());
        if (goods == null) {
            return false;
        }
        if (goodsDto.getName() != null && !goods.getName().equals(goodsDto.getName())) {
            //修改名字
            if (goodsMapper.updateName(goodsDto.getId(), goodsDto.getName()) <= 0) {
                return false;
            }
        }
        if (goodsDto.getTypeId() != null && goodsDto.getTypeId() != 0 && goods.getTypeId() != goodsDto.getTypeId()) {
            //修改类型

            if (goodsMapper.updateGoodsType(goodsDto.getId(), goodsDto.getTypeId()) <= 0) {
                return false;
            }
        }
        if (goodsDto.getCount() != 0 && goods.getCount() != goodsDto.getCount()) {
            //修改数量
            if (goodsMapper.updateCount(goodsDto.getId(), goodsDto.getCount()) <= 0) {
                return false;
            }
        }
        if (goodsDto.getPrice() > 0 && goods.getPrice() != goodsDto.getPrice()) {
            //修改价格
            if (goodsMapper.updatePrice(goodsDto.getId(), goodsDto.getPrice()) <= 0) {
                return false;
            }
        }
        if (goodsDto.getUrl() != null && !goods.getUrl().equals(goodsDto.getUrl())) {
            //修改图片地址
            if (goodsMapper.updateUrl(goodsDto.getId(), goodsDto.getUrl()) <= 0) {
                return false;
            }

        }
        return true;
    }


    /**
     * 删除商品
     *
     * @param goodsId 商品id
     * @return 返回是否删除成功
     */
    @Override
    public String deleteGoods(long goodsId) {
        Goods goods = goodsMapper.viewGoodsMessage(goodsId);
        if (goods == null) {
            return "删除失败，没有此商品信息";
        }
        //先删除描述 外键删除对应的也删除
        if (goodsMapper.upadteGoodsState(goodsId) > 0) {
            return "删除成功";
        }
        return "删除失败";
    }


    /**
     * 根据细节id获取细节
     *
     * @param detailsId 细节id
     * @return 返回细节
     */
    @Override
    public String getDetailsByDetailsId(long detailsId) {
        return goodsMapper.getDetailsByDetailsId(detailsId);
    }


    /**
     * 根据类型id获取类型
     *
     * @param typeId 类型id
     * @return 返回类型
     */
    @Override
    public String getTypeByTypeId(int typeId) {
        return goodsMapper.getTypeByTypeId(typeId);
    }

    /**
     * 查看所有类型
     *
     * @return 返回类型视图对象集合
     */
    @Override
    public List<GoodsTypeVo> viewAllType() {
        final List<GoodsType> goodsTypes = goodsMapper.viewAllType();
        List<GoodsTypeVo> goodsTypeVos = new ArrayList<>();
        for (GoodsType goodsType : goodsTypes) {
            GoodsTypeVo goodsTypeVo = new GoodsTypeVo();
            BeanUtils.copyProperties(goodsType, goodsTypeVo);
            goodsTypeVos.add(goodsTypeVo);
        }
        System.out.println(goodsTypeVos.size());
        return goodsTypeVos;
    }

    /**
     * 删除类型
     *
     * @param typeId 类型id
     * @return 返回是否删除成功
     */
    @Override
    public boolean deleteType(int typeId) {
        return goodsMapper.deleteType(typeId) > 0;
    }

    /**
     * 增加类型
     *
     * @param type 类型
     * @return 返回是否增加成功
     */
    @Override
    public boolean addType(String type) {
        return goodsMapper.addType(type) > 0;
    }


    /**
     * 修改类型
     *
     * @param typeId 类型id
     * @param type   类型
     * @return 返回是否修改成功
     */
    @Override
    public boolean updateType(int typeId, String type) {
        return goodsMapper.updateType(typeId, type) > 0;
    }

    /**
     * 查看所有数量
     *
     * @return
     */
    @Override
    public long viewAllGoodsNum() {
        return goodsMapper.viewAllGoodsNum();
    }

    /**
     * 查看名称数量
     *
     * @return
     */
    @Override
    public long viewNumByName(String name) {
        return goodsMapper.viewNumByName(name);
    }

    /**
     * 查看类型数量
     *
     * @return
     */
    @Override
    public long viewNumByType(Integer typeId) {
        return goodsMapper.viewNumByType(typeId);
    }

    /**
     * 查看名称
     *
     * @return
     */
    public List<String> viewGoodsName() {
        return goodsMapper.viewGoodsName();
    }
}
